# coding=utf-8
import pandas as pd
import matplotlib.pyplot as plt
import os
from datetime import datetime

import xlrd
import xlwt
from openpyxl import load_workbook

# 设置中文字体
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题


def read_excel_data(file_path):
    """读取 Excel 文件数据"""
    try:
        df = pd.read_excel(file_path)
        print(f"成功读取文件: {file_path}")
        print(f"数据包含 {df.shape[0]} 行，{df.shape[1]} 列")
        print(f"列名: {', '.join(df.columns.tolist())}")
        return df
    except Exception as e:
        print(f"读取 Excel 文件出错: {e}")
        return None


def generate_bar_chart(data, x_col, y_col, output_path):
    """生成柱状图"""
    plt.figure(figsize=(10, 6))
    plt.bar(data[x_col], data[y_col])
    plt.title(f"{y_col} 分布柱状图")
    plt.xlabel(x_col)
    plt.ylabel(y_col)
    plt.xticks(rotation=45)
    plt.tight_layout()
    plt.savefig(output_path)
    plt.close()


def generate_pie_chart(data, category_col, value_col, output_path):
    """生成扇形图"""
    plt.figure(figsize=(8, 8))
    plt.pie(data[value_col], labels=data[category_col], autopct='%1.1f%%', startangle=90)
    plt.title(f"{value_col} 分布扇形图")
    plt.tight_layout()
    plt.savefig(output_path)
    plt.close()


def generate_line_chart(data, x_col, y_col, output_path):
    """生成折线图"""
    plt.figure(figsize=(10, 6))
    plt.plot(data[x_col], data[y_col], marker='o')
    plt.title(f"{y_col} 趋势折线图")
    plt.xlabel(x_col)
    plt.ylabel(y_col)
    plt.xticks(rotation=45)
    plt.grid(True)
    plt.tight_layout()
    plt.savefig(output_path)
    plt.close()


def generate_html_report(chart_paths, output_path):
    """生成 HTML 报告"""
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    html_content = f"""
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>数据可视化报告</title>
        <style>
            body {{ font-family: Arial, sans-serif; margin: 20px; }}
            h1, h2 {{ color: #333; }}
            .chart-container {{ margin-bottom: 40px; }}
            img {{ max-width: 100%; height: auto; box-shadow: 0 4px 8px rgba(0,0,0,0.1); }}
            .timestamp {{ color: #666; font-size: 0.9em; }}
        </style>
    </head>
    <body>
        <h1>数据可视化报告</h1>
        <p class="timestamp">生成时间: {timestamp}</p>

        {''.join([f'<div class="chart-container"><h2>{title}</h2><img src="{title}.png" alt="{title}"></div>'
                  for title, path in chart_paths.items()])}

        <footer>
            <p>© 2023 数据可视化工具</p>
        </footer>
    </body>
    </html>
    """

    with open(output_path, 'w', encoding='utf-8') as f:
        f.write(html_content)


def main():
    # 文件路径设置
    xls_file = 'C:/Users/IT14/Desktop/DATA1.xls'  # 请替换为实际的 XLS 文件路径
    output_html = 'data_visualization_report.html'

    # 读取数据
    df = read_excel_data(xls_file)
    if df is None or df.empty:
        print("无法读取数据或数据为空，程序退出。")
        return

    # 生成图表（根据实际数据结构调整列名）
    chart_data = {}

    # 示例：假设 XLS 文件包含以下列
    # - 产品名称
    # - 销售额
    # - 销量
    # - 日期

    # 检查列是否存在
    required_columns = ['产品名称', '销售额', '销量', '日期']
    missing_columns = [col for col in required_columns if col not in df.columns]

    if missing_columns:
        print(f"错误：数据中缺少以下列: {', '.join(missing_columns)}")
        print(f"可用列: {', '.join(df.columns.tolist())}")
        print("请根据实际数据结构修改代码中的列名。")
        return

    # 生成柱状图（销售额分布）
    chart_data['产品销售额分布柱状图'] = generate_bar_chart(
        df, '产品名称', '销售额', '产品销售额分布柱状图')

    # 生成扇形图（销量占比）
    chart_data['产品销量占比扇形图'] = generate_pie_chart(
        df, '产品名称', '销量', '产品销量占比扇形图')

    # 生成折线图（销售额趋势）
    chart_data['销售额趋势折线图'] = generate_line_chart(
        df, '日期', '销售额', '销售额趋势折线图')

    # 生成 HTML 报告
    generate_html_report(chart_data, output_html)
    print("报告生成完成，请在浏览器中打开 HTML 文件查看。")


if __name__ == "__main__":
    main()